package com.koocloud.electroplatemanage.utils;

import cn.hutool.db.Db;
import cn.hutool.db.Entity;
import org.springframework.util.StringUtils;

import java.math.BigDecimal;
import java.sql.SQLException;
import java.util.List;
import static com.koocloud.electroplatemanage.constant.IncomePartJudgeSqlFieldConstant.*;

/**
 * @program: electroplatemanage
 * @description: 来料公式工具类
 * @author: zww
 * @create: 2020-10-26 16:08
 */
public class FormulaUtils {
    public static String calculation(String formula,String id) throws SQLException {
        String value="";
        switch (formula.substring(4,5)) {
        case "=":value = strAdd(formula,id);//字符串拼接
        break;
        case "+":value = add(formula,id);//加法
        break;
        case "-":value = sub(formula,id);//减法
        break;
        case "*":value = multiply(formula,id);//乘法
        break;
        case "/":value = division(formula,id);//除法
        break;
        case "F":value = formula.substring(5,formula.length());//赋默认值
            break;
            default:value="";
            break;
       }
        return value;
    }
    //除
    private static String division(String formula,String id) throws SQLException {

        //取得公式的第一个参数
        String paramOne = formula.substring(0,4);
        //取得公式的第二个参数
        String paramTwo = formula.substring(5,9);
        //获取字段编码对应的实体
        List<Entity> listFieldOne= Db.use().findAll(Entity.create(FIELD_TABLE_NAME).set(FIELD_CODE, paramOne));
        List<Entity> listFieldTwo=Db.use().findAll(Entity.create(FIELD_TABLE_NAME).set(FIELD_CODE, paramTwo));
        //获取对应的英文字段名称
        String enFieldNameOne = listFieldOne.get(0).getStr(EN_FIELD_NAME);
        String enFieldNameTwo = listFieldTwo.get(0).getStr(EN_FIELD_NAME);
        //获取对应的数值
        List<Entity> listValueOne=Db.use().findAll(Entity.create(INCOME_PART_TABLE_NAME).set(ID, id));

        //获取主表对应订单号的字段编码的值
        String FieldValueOne = listValueOne.get(0).getStr(enFieldNameOne);
        String FieldValueTwo = listValueOne.get(0).getStr(enFieldNameTwo);
        //第一个参数为空 置0
        if(StringUtils.isEmpty(FieldValueOne)) {
            FieldValueOne="0";
        }
        //第一个参数为空 置1 分母不能为0
        if(StringUtils.isEmpty(FieldValueTwo)) {
            FieldValueTwo="1";
        }
        //构造精确计算BigDecimal对象
        BigDecimal bdOne = new BigDecimal(FieldValueOne);
        BigDecimal bdTwo = new BigDecimal(FieldValueTwo);
        //除法计算
        String result = bdOne.divide(bdTwo).toString();
        return result;
    }
    //乘
    private static String multiply(String formula,String id) throws SQLException {
        //取得公式的第一个参数
        String paramOne = formula.substring(0,4);
        //取得公式的第二个参数
        String paramTwo = formula.substring(5,9);
        //获取字段编码对应的实体
        List<Entity> listFieldOne= Db.use().findAll(Entity.create(FIELD_TABLE_NAME).set(FIELD_CODE, paramOne));
        List<Entity> listFieldTwo=Db.use().findAll(Entity.create(FIELD_TABLE_NAME).set(FIELD_CODE, paramTwo));
        //获取对应的英文字段名称
        String enFieldNameOne = listFieldOne.get(0).getStr(EN_FIELD_NAME);
        String enFieldNameTwo = listFieldTwo.get(0).getStr(EN_FIELD_NAME);
        //获取对应的数值
        List<Entity> listValueOne=Db.use().findAll(Entity.create(INCOME_PART_TABLE_NAME).set(ID, id));

        //获取主表对应订单号的字段编码的值
        String FieldValueOne = listValueOne.get(0).getStr(enFieldNameOne);
        String FieldValueTwo = listValueOne.get(0).getStr(enFieldNameTwo);
        //第一个参数为空 置0
        if(StringUtils.isEmpty(FieldValueOne)) {
            FieldValueOne="0";
        }
        //第一个参数为空 置0
        if(StringUtils.isEmpty(FieldValueTwo)) {
            FieldValueTwo="0";
        }
        //构造精确计算BigDecimal对象
        BigDecimal bdOne = new BigDecimal(FieldValueOne);
        BigDecimal bdTwo = new BigDecimal(FieldValueTwo);
        //乘法计算
        String result = bdOne.multiply(bdTwo).toString();
        return result;
    }
    //减
    private static String sub(String formula,String id) throws SQLException {
        //取得公式的第一个参数
        String paramOne = formula.substring(0,4);
        //取得公式的第二个参数
        String paramTwo = formula.substring(5,9);
        //获取字段编码对应的实体
        List<Entity> listFieldOne= Db.use().findAll(Entity.create(FIELD_TABLE_NAME).set(FIELD_CODE, paramOne));
        List<Entity> listFieldTwo=Db.use().findAll(Entity.create(FIELD_TABLE_NAME).set(FIELD_CODE, paramTwo));
        //获取对应的英文字段名称
        String enFieldNameOne = listFieldOne.get(0).getStr(EN_FIELD_NAME);
        String enFieldNameTwo = listFieldTwo.get(0).getStr(EN_FIELD_NAME);
        //获取对应的数值
        List<Entity> listValueOne=Db.use().findAll(Entity.create(INCOME_PART_TABLE_NAME).set(ID, id));

        //获取主表对应订单号的字段编码的值
        String FieldValueOne = listValueOne.get(0).getStr(enFieldNameOne);
        String FieldValueTwo = listValueOne.get(0).getStr(enFieldNameTwo);
        //第一个参数为空 置0
        if(StringUtils.isEmpty(FieldValueOne)) {
            FieldValueOne="0";
        }
        //第一个参数为空 置0
        if(StringUtils.isEmpty(FieldValueTwo)) {
            FieldValueTwo="0";
        }
        //构造精确计算BigDecimal对象
        BigDecimal bdOne = new BigDecimal(FieldValueOne);
        BigDecimal bdTwo = new BigDecimal(FieldValueTwo);
        //减法计算
        String result = bdOne.subtract(bdTwo).toString();
        return result;
    }
    //加
    private static String add(String formula,String id) throws SQLException {
        //取得公式的第一个参数
        String paramOne = formula.substring(0,4);
        //取得公式的第二个参数
        String paramTwo = formula.substring(5,9);
        //获取字段编码对应的实体
        List<Entity> listFieldOne= Db.use().findAll(Entity.create(FIELD_TABLE_NAME).set(FIELD_CODE, paramOne));
        List<Entity> listFieldTwo=Db.use().findAll(Entity.create(FIELD_TABLE_NAME).set(FIELD_CODE, paramTwo));
        //获取对应的英文字段名称
        String enFieldNameOne = listFieldOne.get(0).getStr(EN_FIELD_NAME);
        String enFieldNameTwo = listFieldTwo.get(0).getStr(EN_FIELD_NAME);
        //获取对应的数值
        List<Entity> listValueOne=Db.use().findAll(Entity.create(INCOME_PART_TABLE_NAME).set(ID, id));

        //获取主表对应订单号的字段编码的值
        String FieldValueOne = listValueOne.get(0).getStr(enFieldNameOne);
        String FieldValueTwo = listValueOne.get(0).getStr(enFieldNameTwo);
        //第一个参数为空 置0
        if(StringUtils.isEmpty(FieldValueOne)) {
            FieldValueOne="0";
        }
        //第一个参数为空 置0
        if(StringUtils.isEmpty(FieldValueTwo)) {
            FieldValueTwo="0";
        }
        //构造精确计算BigDecimal对象
        BigDecimal bdOne = new BigDecimal(FieldValueOne);
        BigDecimal bdTwo = new BigDecimal(FieldValueTwo);
        //加法计算
        String result = bdOne.add(bdTwo).toString();
        return result;
    }
    //字符串拼接
    private static String strAdd(String formula,String id) throws SQLException {
        //取得公式的第一个参数
        String paramOne = formula.substring(0,4);
        //取得公式的第二个参数
        String paramTwo = formula.substring(5,9);
        //获取字段编码对应的实体
        List<Entity> listFieldOne= Db.use().findAll(Entity.create(FIELD_TABLE_NAME).set(FIELD_CODE, paramOne));
        List<Entity> listFieldTwo=Db.use().findAll(Entity.create(FIELD_TABLE_NAME).set(FIELD_CODE, paramTwo));
        //获取对应的英文字段名称
        String enFieldNameOne = listFieldOne.get(0).getStr(EN_FIELD_NAME);
        String enFieldNameTwo = listFieldTwo.get(0).getStr(EN_FIELD_NAME);
        //获取对应的数值
        List<Entity> listValueOne=Db.use().findAll(Entity.create(INCOME_PART_TABLE_NAME).set(ID, id));

        //获取主表对应订单号的字段编码的值
        String FieldValueOne = listValueOne.get(0).getStr(enFieldNameOne);
        String FieldValueTwo = listValueOne.get(0).getStr(enFieldNameTwo);
        //第一个参数为空 置空字符串""
        if(StringUtils.isEmpty(FieldValueOne)) {
            FieldValueOne="";
        }
        //第一个参数为空 置空字符串""
        if(StringUtils.isEmpty(FieldValueTwo)) {
            FieldValueTwo="";
        }
        return FieldValueOne + FieldValueTwo;
    }

    public static void main(String[] args) throws SQLException {
       //System.out.println(calculation("F001/F002","1"));
    /*    System.out.println("1111111111111111111:"+SecondCheck.formulaCheck("FFFFF111111111111"));
        System.out.println("1111111111111111111:"+SecondCheck.formulaCheck(null));
        System.out.println("1111111111111111111:"+SecondCheck.formulaCheck(""));*/
        String formula ="FFFFF";
        String value = formula.substring(5,formula.length());//赋默认值
        System.out.println("11111111111111111:"+value);
  /*      System.out.println("1111111111111111111:"+calculation("F001=F002","1"));
        System.out.println("1111111111111111111:"+calculation("F001*F002","1"));
        System.out.println("1111111111111111111:"+calculation("F001+F002","1"));
        System.out.println("1111111111111111111:"+calculation("F001-F002","1"));*/
    }
}